/**
 * 
 */
package belote.model.jeu;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Gwenn
 * 
 */
public enum Carte {

	AS_DE_PIQUE     (Couleur.PIQUE, Figure.AS),     //
	ROI_DE_PIQUE    (Couleur.PIQUE, Figure.ROI),    //
	DAME_DE_PIQUE   (Couleur.PIQUE, Figure.DAME),   //
	VALLET_DE_PIQUE (Couleur.PIQUE, Figure.VALLET), //
	DIX_DE_PIQUE    (Couleur.PIQUE, Figure.DIX),    //
	NEUF_DE_PIQUE   (Couleur.PIQUE, Figure.NEUF),   //
	HUIT_DE_PIQUE   (Couleur.PIQUE, Figure.HUIT),   //
	SEPT_DE_PIQUE   (Couleur.PIQUE, Figure.SEPT),   //

	AS_DE_CARREAU     (Couleur.CARREAU, Figure.AS), //
	ROI_DE_CARREAU    (Couleur.CARREAU, Figure.ROI), //
	DAME_DE_CARREAU   (Couleur.CARREAU, Figure.DAME), //
	VALLET_DE_CARREAU (Couleur.CARREAU, Figure.VALLET), //
	DIX_DE_CARREAU    (Couleur.CARREAU, Figure.DIX), //
	NEUF_DE_CARREAU   (Couleur.CARREAU, Figure.NEUF), //
	HUIT_DE_CARREAU   (Couleur.CARREAU, Figure.HUIT), //
	SEPT_DE_CARREAU   (Couleur.CARREAU, Figure.SEPT), //

	AS_DE_TREFLE     (Couleur.TREFLE, Figure.AS), //
	ROI_DE_TREFLE    (Couleur.TREFLE, Figure.ROI), //
	DAME_DE_TREFLE   (Couleur.TREFLE, Figure.DAME), //
	VALLET_DE_TREFLE (Couleur.TREFLE, Figure.VALLET), //
	DIX_DE_TREFLE    (Couleur.TREFLE, Figure.DIX), //
	NEUF_DE_TREFLE   (Couleur.TREFLE, Figure.NEUF), //
	HUIT_DE_TREFLE   (Couleur.TREFLE, Figure.HUIT), //
	SEPT_DE_TREFLE   (Couleur.TREFLE, Figure.SEPT), //

	AS_DE_COEUR     (Couleur.COEUR, Figure.AS), //
	ROI_DE_COEUR    (Couleur.COEUR, Figure.ROI), //
	DAME_DE_COEUR   (Couleur.COEUR, Figure.DAME), //
	VALLET_DE_COEUR (Couleur.COEUR, Figure.VALLET), //
	DIX_DE_COEUR    (Couleur.COEUR, Figure.DIX), //
	NEUF_DE_COEUR   (Couleur.COEUR, Figure.NEUF), //
	HUIT_DE_COEUR   (Couleur.COEUR, Figure.HUIT), //
	SEPT_DE_COEUR   (Couleur.COEUR, Figure.SEPT); //

	// -------------------------------------------------------------- Attributs

	private final Couleur couleur;

	private final Figure figure;

	private final String code;

	// ----------------------------------------------------------- Constructeur

	private Carte(Couleur pCouleur, Figure pFigure) {
		this.couleur = pCouleur;
		this.figure = pFigure;

		StringBuilder sb = new StringBuilder(3);
		sb.append(pCouleur.getCode());
		sb.append(pFigure.getCode());
		this.code = sb.toString();
	}

	// ----------------------------------------------------- Methodes publiques
	
	/**
	 * Retourne le nombre de point de la carte.
	 * 
	 * @return
	 */
	public int getPoints(Couleur pAtout) {

		if (couleur == pAtout) {
			return figure.getPointsAtout();
		} else {
			return figure.getPoints();
		}
	}

	/**
	 * Retourne la valeur de la carte, plus la valeur est haute plus la carte
	 * est forte.
	 * 
	 * @return
	 */
	public int getValeur(Couleur pAtout) {

		if (couleur == pAtout) {
			return figure.getValeurAtout();
		} else {
			return figure.getValeur();
		}
	}

	// ------------------------------------------------------ Getters & Setters

	public Couleur getCouleur() {
		return couleur;
	}

	public Figure getFigure() {
		return figure;
	}

	public String getCode() {
		return code;
	}
	
	// -------------------------------------------------------------- Statiques
	
	private static Map<String, Carte> referentielCarte;
	
	public static synchronized Carte getCarte(String pCode) {
		
		if (referentielCarte == null) {
			referentielCarte = new HashMap<String, Carte>(32);
			for (Carte carte : Carte.values()) {
				referentielCarte.put(carte.getCode(), carte);
			}
		}
		return referentielCarte.get(pCode);
	}
}
